package Thread;
// 线程的创建（1）
/**
 * 继承Thread类并重写run方法
 */
// 线程2：通过创建 MyThread 类的一个实例并调用其 start 方法，创建了一个新的线程
class MyThread extends Thread {
    // 标记为重写方法（Override）,覆盖Thread类中的run方法
    @Override
    // 线程的入口方法，新的线程启动执行这里的代码，不需要手动调用，新的线程创建好后，自动的去执行
    // 相当于回调函数，写好的函数自己不去调用，交给别人来调用
    public void run() {
//        for(int i = 0;i < 5;i++) {
//            System.out.println("hello thread");
//        }
        while(true) {
            System.out.println("hello thread");
            try {
                // 当前线程暂停执行1000ms
                Thread.sleep(1000);
                // 抛出 InterruptedException ,因为线程在休眠期间可能会被其他线程调用interrupt()方法打断
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

public class demo1 {
    // 线程1:main,JVM启动程序时就创建了
    public static void main(String[] args) throws InterruptedException {
        // 创建MyThread类的实例，实例是一个线程对象
        // Thread是java.lang 包的一部分，Java编译器自动导入java.lang这个包
        // 向上转型，MyThread是Thread的一个子类，将子类对象的引用赋值给父类变量，可以用父类的引用变量处理不同的子类对象
        Thread t = new MyThread();
        // start创建，真正在系统中创建线程（JVM 调用操作系统的API完成线程的创建操作）
        t.start();
        // 这个操作没有创建线程，只是调用了重写的run,进程中只有一个main线程,这样子还是一个单线程
        // t.run();
        while(true) {
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}
